package estadistec.logica.dependencias;

import estadistec.excepciones.ExcepcionLlaveInexistente;
import estadistec.excepciones.ExcepcionLlaveExistente;

import estadistec.logica.gestores.IManejable;

/**
 * Gestionables que dependen de otro gestionable. Es la interface que
 * permite la comunicación hacia arriba.
 */
public interface IDependiente<M extends ISuperior> extends IManejable
{

	/**
	 * Agrega al superior (observado) a la lista de superiores.
	 * 
	 * @param superior
	 *            A ser insertado
	 * @throws Excepcion
	 *             Si el superior ya fue insertado.
	 */
	void agregarSuperior(M superior) throws ExcepcionLlaveExistente;

	/**
	 * Quita al superior de la lista de superiores.
	 * 
	 * @param llaveSuperior
	 *            Llave del elemento que va a ser eliminado de la lista de 
	 *            superiores.
	 * @throws Excepcion
	 *             Si @p superior no se encuentra en la lista de superiores.
	 */
	void quitarSuperior(Long llaveSuperior) throws ExcepcionLlaveInexistente;

	/**
	 * Recalcula el valor de éste objeto. Es llamado cuando un dependiente
	 * (observador) necesita ser actualizado.
	 */
	void actualizar();

	/**
	 * Elimina las relaciones entre los superiores a este objeto. Cuando un
	 * superior es actualizado ya dejará de notificar a @p this objeto.
	 */
	void independizate() throws ExcepcionLlaveInexistente;

}
